home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / t3_1 / doc.lha / documentation / manual / tree.mss < prev    next >
Text File  |  1987-06-30  |  8KB  |  224 lines

  1. @part[TREE, root "TMAN.MSS"]    @Comment{-*-System:TMAN-*-}
  2. @chap[Trees]
  3. @label[TreesChapter]
  4.  
  5.  
  6. @dc{ Bletch.  Rewrite this intro.  It's all out of order. }
  7.  
  8. This chapter describes procedures available for manipulating trees.  The
  9. term @iixs[tree] is used in a technical sense to refer to non-circular
  10. list structure considered as tree data-structures, as contrasted with
  11. @i[lists], which use chained pairs to represent a one-dimensional
  12. sequence of objects.  Thus one might say either that @wt[(A (B C) D)] is
  13. a list of three elements, or that it is a tree with four (non-null)
  14. leaves.
  15.  
  16. Trees are used to represent programs.  The tree-manipulation
  17. procedures and special forms are designed with this in mind.
  18. @dc{ The tree paradigm may be useful for other things also. }
  19.  
  20.  
  21. @section[Comparison]
  22. @index[Equality predicates]
  23.  
  24. @desc[(EQUIV? @i[object1 object2]) @yl[] @i[boolean]]
  25. @tc[EQUIV?] is an equality predicate, not for comparing trees but for
  26. comparing leaves.
  27.  
  28. @itemize[
  29. If @tc[(EQ? @i[object1] @i[object2])], then
  30. @tc[(EQUIV? @i[object1] @i[object2])].
  31.  
  32. If @i[object1] and @i[object2] are both numbers of the same type,
  33. then they are @tc[EQUIV?] iff they have the same numeric value
  34. (see @tc[=], page @pageref[EQUAL?]).
  35.  
  36. If @i[object1] and @i[object2] are both strings,
  37. then they are @tc[EQUIV?] if they are @tc[STRING-EQUAL?]
  38. (page @pageref[STRING-EQUAL?]).
  39. ]
  40. See also the descriptions of @tc[EQ?] (page @pageref[EQ?]) and @tc[=]
  41. (page @pageref[EQUAL?]).
  42.  
  43.     @BeginInset[Bug:]
  44.     In @Timp[] 2.7, @tc[EQUIV?] (and @tc[ALIKEV?]) may return false
  45.     for two numbers which are @tc[=].  It will do the right thing,
  46.     however, for integers which are less than 2@+[28] in magnitude.
  47.     @EndInset[]
  48. @EndDesc[EQUIV?]
  49.  
  50. @dc{ There ought to be an entire section on equality, describing the
  51. relative merits and disadvantages of @tc[EQ?], @tc[EQUAL?], @tc[EQUIV?],
  52. @tc[ALIKEQ?], and @tc[ALIKEV?]. }
  53.  
  54. @desc[@el[](ALIKE? @i[predicate tree1 tree2]) @yl[] @i[boolean]]
  55. Returns true if @i[tree1] and @i[tree2] have the same shape
  56. and their corresponding leaves are equal according to
  57. @i[predicate], which must be an equality predicate.
  58. @begin[ProgramExample]
  59. (ALIKE? = '(1 (2 . 8) 3) '(1 (2 . 8) 3))  @ev[]  @r[true]
  60. @end[ProgramExample]
  61. @EndDesc[ALIKE?]
  62.  
  63. @desc[(ALIKEQ? @i[tree1 tree2]) @yl[] @i[boolean]]
  64.   @begin[ProgramExample]
  65. (ALIKEQ? @i[tree1 tree2])  @ce[]  (ALIKE? EQ? @i[tree1 tree2])
  66.   @end[ProgramExample]
  67. @EndDesc[ALIKEQ?]
  68.  
  69. @info[EQUIV="EQUAL"]
  70. @desc[@el[](ALIKEV? @i[tree1 tree2]) @yl[] @i[boolean]]
  71. @ProgramExample[
  72. (ALIKEV? @i[tree1] @i[tree2])  @ce[]  (ALIKE? EQUIV? @i[tree1] @i[tree2])
  73. ]
  74. @label[ALIKEV]
  75. Roughly speaking, two trees are @tc[ALIKEV?] if they print the
  76. same way.
  77. @EndDesc[ALIKEV?]
  78.  
  79.  
  80. @section[Tree utilities]
  81.  
  82. @desc[(SUBST @i[predicate new old tree]) @yl[] @i[tree]]
  83. Returns a result tree which is the same as the argument @i[tree],
  84. except that leaves in the argument tree which, according to
  85. @i[predicate], are equal to @i[old], have been changed to be
  86. @i[new].  @i[Predicate] must be an equality predicate.
  87.   @begin[ProgramExample]
  88. (SUBST EQUIV? 17 13 '(10 (20 13) 30))  @ev[]  (10 (20 17) 30)
  89.   @end[ProgramExample]
  90. The result returned by @tc[SUBST] may or may not share structure with its
  91. tree argument.
  92. @EndDesc[SUBST]
  93.  
  94. @desc[(SUBSTQ @i[new old tree]) @yl[] @i[tree]]
  95. @ProgramExample[(SUBSTQ @i[new old tree])  @ce[]  (SUBST EQ? @i[new old tree])]
  96. @EndDesc[SUBSTQ]
  97.  
  98. @info[EQUIV="SUBST"]
  99. @desc[(SUBSTV @i[new old tree]) @yl[] @i[tree]]
  100. @begin[ProgramExample]
  101. (SUBSTV @i[new old tree])  @ce[]  (SUBST EQUIV? @I[new old tree])
  102. @end[ProgramExample]
  103. @EndDesc[SUBSTV]
  104.  
  105. @desc[(COPY-TREE @i[tree]) @yl[] @i[tree]]
  106. Recursively make a copy of the @i[tree].
  107. @ProgramExample[(COPY-TREE @i[tree])  @ce[]  (SUBSTQ NIL NIL @i[tree])]
  108. @EndDesc[COPY-TREE]
  109.  
  110. @desc[(TREE-HASH @i[tree]) @yl[] @i[integer]]
  111. Compute a @ix[hash code] for @i[tree].
  112. The hash computed is a non-negative fixnum with the property
  113. that if @i[tree1] and @i[tree2] are @tc[ALIKEV?],
  114. then their hashes are the same.
  115. @dc{ Same across all @Tau[] implementations, or not? }
  116. @EndDesc[TREE-HASH]
  117.  
  118.  
  119. @section[Destructuring]
  120.  
  121. @info[Notes="Special form"]
  122. @desc[(DESTRUCTURE @i[specs . body]) @yl[] @i[value-of-body]]
  123. @i[Specs] has the form @wt[((@i[pattern value]) (@i[pattern value]) ...)]
  124. where each @i[pattern] is either an identifier (e.g., @tc[X])
  125. or a @i[tree] (see page @PageRef[TreesChapter]),
  126. all of whose non-null leaves are identifiers
  127. (e.g., @wt[((X Y . Z) P Q)]).
  128.  
  129. @tc[DESTRUCTURE] is similar to @tc[LET], and in the case that all the
  130. @i[patterns] are symbols, @tc[DESTRUCTURE] and @tc[LET] are
  131. equivalent. But @tc[DESTRUCTURE] is especially useful when one wants
  132. to bind variables to the various nodes in a single tree structure.  For
  133. example, suppose @tc[Z] has the value @wt[(1 (2 3) ((4 5 . 6) 7))],
  134. and we want to bind @tc[A @r[to] 1, B @r[to] 2, C @r[to] (3),
  135. D @r[to] 6, @r[and] E @r[to] 7]. We could write
  136. @begin[ProgramExample]
  137. (LET ((A (CAR Z))
  138.       (B (CAADR Z))
  139.       (C (CDADR Z))
  140.       (D (CDDAR (CADDR Z)))
  141.       (E (CADADR (CDR Z))))
  142.   ...)
  143. @end[ProgramExample]
  144. However, we could also write
  145. @begin[ProgramExample]
  146. (DESTRUCTURE (((A (B . C) ((() () . D) E)) Z))
  147.   ...)
  148. @end[ProgramExample]
  149. The @tc[()]'s notate ignored positions.
  150. @EndDesc[DESTRUCTURE]
  151.  
  152. @info[Notes="Special form"]
  153. @desc[(DESTRUCTURE* @i[specs . body]) @yl[] @i[value-of-body]]
  154. @tc[DESTRUCTURE*] is the @qu"serial" form of @tc[DESTRUCTURE], just
  155. as @tc[LET*] is the @qu"serial" form of @tc[LET].
  156. @begin[ProgramExample]
  157. (DESTRUCTURE* ((@i[pattern@-(1) value@-(1)])
  158.                (@i[pattern@-(2) value@-(2)])
  159.                ...
  160.                (@i[pattern@-(n) value@-(n)]))
  161.   @i[code])
  162.   @ce[]
  163. (DESTRUCTURE ((@i[pattern@-(1) value@-(1)]))
  164.   (DESTRUCTURE ((@i[pattern@-(1) value@-(1)]))
  165.    ...
  166.      (DESTRUCTURE ((@i[pattern@-(n) value@-(n)]))
  167.        @i[code] )...))
  168. @end[ProgramExample]
  169. @EndDesc[DESTRUCTURE*]
  170.  
  171.  
  172. @section[Backquote]
  173. @Label[backquote section]    @Comment{ref: syntax chapter}
  174. @index[Backquote]@index[Quasi-quote]
  175.  
  176. @tau[]'s @i[backquote] facility, inherited from the Maclisp family
  177. of Lisps, is useful for building programs whose form
  178. is determined, but where some of the structure is constant
  179. and some is to be filled in.
  180. This is especially convenient in the definitions of macro
  181. expanders.
  182. It is so useful that a special external syntax is provided
  183. for notating such templates.
  184. It takes its name from the name
  185. of the character (backquote, @tc[`]) which introduces this special syntax.
  186.  
  187. The functionality provided by backquote is sometimes called @qu(quasi-quote)
  188. because it behaves like @tc[QUOTE] except that one can specify that
  189. subforms of the backquoted form should be evaluated.  Inside a form
  190. that is preceded by a backquote, two additional pieces of
  191. external syntax are active: comma (@tc[,]), and comma at-sign (@tc[,@@]);
  192. these are the ways to indicate that some subform should
  193. be evaluated (i.e., unquoted).  A subform preceded by a comma
  194. is evaluated and replaced by the result of the evaluation.
  195. A subform preceded by a comma at-sign is evaluated and replaced
  196. by @i[splicing in] the result of the evaluation.
  197.  
  198. Here are some simple examples.  Note that the first example shows code
  199. equivalence, not evaluation.
  200. @begin[ProgramExample]
  201. `(A B ,X Y)  @ce[]  (LIST 'A 'B X 'Y)
  202.  
  203. (DEFINE X '(3))
  204. (CDR `(A B ,X C))    @ev[]  (B (3) C)
  205. (CDR `(A B ,@@X C))  @ev[]  (B 3 C)
  206.  
  207. (DEFINE-SYNTAX (REPEAT N . CODE)     ;Execute CODE N times
  208.   `(LET ((COUNT ,N) (THUNK (LAMBDA () ,@@CODE)))
  209.      (DO ((COUNT COUNT (-1+ COUNT)))
  210.          ((<=0? COUNT) '())
  211.        (THUNK))))
  212. @end[ProgramExample]
  213.  
  214. It is possible to nest backquoted forms.  This is useful when writing complex
  215. source-to-source transformations.
  216.   @begin[ProgramExample]
  217. (DEFINE-SYNTAX (FOO X Y)
  218.   `(LET ((STUFF ,X))
  219.      `((STUFF-IS ,STUFF)
  220.        (Y-IS ,',Y))))
  221.  
  222. (FOO (+ 3 5) BAZ)  @ev[]  ((STUFF-IS 8) (Y-IS BAZ))
  223.   @end[ProgramExample]
  224.